/*
 * =====================================================================================
 *
 *       Filename:  isoceles-triangle.c
 *
 *    Description:  等腰三角形
 *
 *        Version:  1.0
 *        Created:  2017年05月16日 14时54分29秒
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  Crane (), wanghe@galaxyeye-tech.com
 *   Organization:  Galaxy-eye
 *
 * =====================================================================================
 */

#include <assert.h>
#include <stdio.h>
#include <stdlib.h>

#define  STAR   '*'
#define  SPACE  ' '


// *
// **
// ***
// ****
// *****

// *****
//  ****
//   ***
//    **
//     *

// 在图形中返回1, 图形外返回0
int right_angle_law(int x, int y)
{
    return x <= y;
}

void right_angle_triangle(int level)
{
    assert( level > 0 );

    for(int y = 0; y < level; y++)
    {
        for(int x = 0; x < level ; x ++)
            putchar( right_angle_law(x, y)? STAR : SPACE );

        putchar('\n');
    }
}


//     *
//    ***
//   *****
//  *******
// *********

// *********
// **** ****
// ***   ***
// **     **
// *       *
int pyramid_law(int x, int y)
{
    return y >= abs(x);
}

void pyramid(int level)
{
    assert(level > 0);

    int x_max = level - 1;

    for ( int y = 0; y < level; y ++ )
    {
        for (int x = -x_max; x <= x_max; x ++ )
        {
            putchar( pyramid_law(x, y)? STAR : SPACE );
        }

        putchar('\n');
    }
}

/*(x +  2)  % unitBottom - 2*/

int modx(int x, int unitBottom)
{
    int half = (unitBottom - 1) / 2;

    if ( x >= 0 )
        return  (x + half ) % unitBottom - half;
    else
        return  -modx(-x, unitBottom);

}

// 密铺: 参数level是高度, maxLength是密铺单元三角形的底边长.
void pyramid_tessellation(int level, int unitBottom)
{
    assert(level > 0);
    assert( unitBottom % 2 == 1 );

    int x_max = level - 1;

    int unitHeight = (unitBottom + 1) / 2;

    for ( int y = 0; y < level; y ++ )
    {
        for (int x = -x_max; x <= x_max; x ++ )
        {
            // 没搞出来
            /*putchar( pyramid_law(x % unitBottom, y % unitHeight)? STAR : SPACE );*/
            /*putchar( pyramid_law((x +  2)  % unitBottom - 2, y % unitHeight)? STAR : SPACE );*/
            putchar( pyramid_law( modx (x, unitBottom) , y % unitHeight)? STAR : SPACE );
            fflush( stdout );
        }

        putchar('\n');
    }
}


int main(int argc, char **argv)
{
    /*triangle(5);*/
    if ( argc < 2 )
        fprintf(stderr, "usage: isoceles-triangle  <num>");

    int level = atoi(argv[1]);

    right_angle_triangle( level );
    pyramid( level );
    pyramid_tessellation(30, 5 );
}
